<?php
/**
 * 支付宝wap手机支付控制器
 */
namespace Mobile\Controller;
use Think\Controller;

class PayalipcController extends Controller
{

    public $api_url = 'https://mapi.alipay.com/gateway.do?';

     
     public $ALIPAY_PAYKEY = 'u1778kjbn6pa01ietcruwcw2y8o8qfa7';//合伙伙伴密匙
     public $partner = '2088231661760910';//支付宝合作者身份ID 2088开头
    
    public function __construct()
    {
        parent::__construct();
      //  $this->ALIPAY_PAYKEY = C('ALIPAY_PAYKEY'); //合伙伙伴密匙
      //  $this->partner =  C('ALIPAY_PARTNER'); //支付宝合作者身份ID 2088开头
    }

    public function wappay($data){
        
        $data['service'] = 'create_direct_pay_by_user';
        $data['partner'] = $this->partner;//支付宝合作者身份ID 2088开头
        $data['_input_charset'] = 'utf-8';
        $data['sign_type'] = 'MD5';//DSA、RSA、MD5三个值可选，必须大写。
        
        $data['seller_id'] = $data['partner'];//卖家支付宝账号
        
        $data['payment_type'] = '1';//1商品购买
        
        
//         取值范围：1m～15d。
//         m-分钟，h-小时，d-天，1c-当天（1c-当天的情况下，无论交易何时创建，都在0点关闭）。
//         该参数数值不接受小数点，如1.5h，可转换为90m。
//         当用户输入支付密码、点击确认付款后（即创建支付宝交易后）开始计时。
//         支持绝对超时时间，格式为yyyy-MM-dd HH:mm。
       //$data['it_b_pay'] = '3d';//选填,超时时间设置未付款交易的超时时间，一旦超时，该笔交易就会自动被关闭。

       // $data['rn_check'] = 'F';//是否发起实名校验T：发起实名校验； F：不发起实名校验。
        //买家证件号码（需要与支付宝实名认证时所填写的证件号码一致）。当scene=ZJCZTJF的情况下，才会校验buyer_cert_no字段。
       // $data['buyer_cert_no'] = '';//	
       // $data['buyer_real_name'] = '';//当scene=ZJCZTJF的情况下，才会校验buyer_real_name字段。
       // $data['scene'] = 'ZJCZTJF';//收单场景。如需使用该字段，需向支付宝申请开通，否则传入无效。
        
        
        //$data['goods_type'] = '0';//	商品类型。1：实物类商品0：虚拟类商品 不传默认为实物类商品。
        
        //app_pay=Y：尝试唤起支付宝客户端进行支付，若用户未安装支付宝，则继续使用wap收银台进行支付。
        //商户若为APP，则需在APP的webview中增加alipays协议处理逻辑。商户若为APP，则需在APP的webview中增加alipays协议处理逻辑。
        
       // $data['app_pay'] = 'N';//
        
        $data['sign'] = $this->_getSign($data);
        
        $params = http_build_query($data);
        $api_url = $this->api_url.$params;
        
        return $api_url;
        
    }

    
    /**
     * 	作用：生成签名
     */
    protected function _getSign($Obj)
    {
        //过滤参数
        $Obj = $this->_paraFilter($Obj);
        
        foreach ($Obj as $k => $v)
        {
            $Parameters[$k] = $v;
        }
        //签名步骤一：按字典序排序参数
        ksort($Parameters);
        
        $String = $this->_createLinkstring($Parameters);

        //echo '【string1】'.$String.'</br>';
        //签名步骤二：在string后加入KEY
    
        $String = $String.$this->ALIPAY_PAYKEY;
        //echo "【string2】".$String."</br>";
        //签名步骤三：MD5加密

        $String = md5($String);

        return $String;
    }
    
    /**
     * 除去数组中的空值和签名参数
     * @param $para 签名参数组
     * return 去掉空值与签名参数后的新签名参数组
     */
    protected function _paraFilter($para) {
        $para_filter = array();
        while (list ($key, $val) = each ($para)) {
            if($key == "sign" || $key == "sign_type" || $val == "")continue;
            else	$para_filter[$key] = $para[$key];
        }
        return $para_filter;
    }
    
    
    /**
     * 把数组所有元素，按照“参数=参数值”的模式用“&”字符拼接成字符串
     * @param $para 需要拼接的数组
     * return 拼接完成以后的字符串
     */
    protected function _createLinkstring($para) {
    	$arg  = "";
    	while (list ($key, $val) = each ($para)) {
    		$arg.=$key."=".$val."&";
    	}
    	//去掉最后一个&字符
    	$arg = substr($arg,0,count($arg)-2);
    	
    	//如果存在转义字符，那么去掉转义
    	if(get_magic_quotes_gpc()){$arg = stripslashes($arg);}
    	
    	return $arg;
    }
    
    
    /*
     * 验证回调的真实性
     */
    public function checkSign($data){
        
        if(empty($data)) {//判断POST来的数组是否为空
            return false;
        }
        
        $sign = $this->_getSign($data);
        $post_sign = $data["sign"];
        if($sign == $post_sign){
            return true;
        }
        
        return false;
    }
    
    
}
